// 修改密码界面设计

// 关闭VSCode非必要报错
// ignore_for_file: camel_case_types, unused_element_parameter, unnecessary_overrides, non_constant_identifier_names, use_build_context_synchronously, must_be_immutable

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:project_award_statistics/utils/dialog_yaru_design/change_passwd/change_passwd_err_empty.dart';
import 'package:project_award_statistics/utils/dialog_yaru_design/change_passwd/change_passwd_err_no_exist_user.dart';
import 'package:project_award_statistics/utils/dialog_yaru_design/change_passwd/change_passwd_err_same_passwd.dart';
import 'package:project_award_statistics/utils/dialog_yaru_design/change_passwd/change_passwd_success.dart';
import 'package:project_award_statistics/utils/load_user_info_from_db/load_user_info.dart';
import 'package:project_award_statistics/utils/load_user_info_from_db/user_model.dart';
import 'package:project_award_statistics/utils/my_yaru_buttons/my_yaru_button_confirmed.dart';
import 'package:window_manager/window_manager.dart';
import 'package:yaru/yaru.dart';

class ChangePasswdPage_Desktop extends StatefulWidget {
  // 让登录页面传入学生姓名,实现开局自动填写姓名栏的功能
  String stu_name;
  ChangePasswdPage_Desktop({
    super.key,
    required this.stu_name,
  });

  @override
  State<ChangePasswdPage_Desktop> createState() => _ChangePasswdPage_DesktopState();
}

class _ChangePasswdPage_DesktopState extends State<ChangePasswdPage_Desktop> with TickerProviderStateMixin{

  // 初始化更改密码用的文本框输入控制器,以获取用户输入的用户名与密码
  TextEditingController textcontroller_user_name=TextEditingController();
  TextEditingController textcontroller_password=TextEditingController();

  // 声明动画总线1
  late AnimationController _animationController_widget3;

  // 初始化淡入淡出效果控制器
  // 设置淡入效果控制总线1默认状态下不可见
  bool widget1_isVisible = false;

  // 设置淡入效果控制总线2默认状态下不可见
  bool widget2_isVisible = false;

  // 当用户准备修改密码时执行的函数
  void change_passwd (String user,String new_passwd) async
    {
      // 先获取所有用户信息
      List<user_info_model> cur_user_info = await DBProvider_UserInfo().get_user_list();

      // 先检查用户是否填写了所有信息,如果没有就返回报错
      if (user.isEmpty || new_passwd.isEmpty)
        {
          showDialog(
            context: context, 
            builder: (context){
              return DialogChangePasswdErr_Empty_Desktop();
            },
          );
        }
      else   // 如果用户两者都填写了
        {
          int i = 0;
          int input_user_point = 0; // input_user_point用于下方循环找到
          bool user_is_exist = false; // user_is_exist用于下方是否在用户数据表中找到对应用户
          for (i=0;i<cur_user_info.length;i++)
            {
              // 如果修改密码的目标对应用户存在
              if (user==cur_user_info[i].stu_name)
                {
                  input_user_point=i;   // 修改修改密码的目标用户下标
                  user_is_exist=true;
                  break;  // 跳出循环,减少不必要循环以节省时间提升效率
                }
            }

          // 如果修改密码的目标用户存在/不存在
          if (user_is_exist)
            {
              // 如果用户输入的新密码与之前的一样
              if (new_passwd==cur_user_info[input_user_point].password)
                {
                  showDialog(
                    context: context, 
                    builder: (context){
                      return DialogChangePasswdErr_SamePasswd_Desktop();
                    },
                  );
                }
              // 如果都符合修改密码的条件就进行修改
              else
                {
                  await DBProvider_UserInfo().change_passwd(user,new_passwd);
                  showDialog(
                    context: context, 
                    builder: (context){
                      return DialogChangePasswdSuccess_Desktop();
                    },
                  );
                }
            } 
          else     // 如果发现用户填写的用户并不存在
            {
              showDialog(
                context: context, 
                builder: (context){
                  return DialogChangePasswdErr_NoExist_Desktop();
                },
              );
            }
        }
    }
    
  // 覆写父类构造函数
  @override
  void initState ()
    {
      super.initState();
      textcontroller_user_name.text=widget.stu_name;    // 让用户名输入框默认填充文本变成学生姓名
      if (mounted)     // if (mounted)检查当前对象是否挂载在树中(也就是被激活),否则对象被移除后再进行执行就会报错
        {              // 不加if (mounted)的具体表现为动画没播放完直接按返回键会直接报错接着VSCode原地红温 (bushi
          Timer(Duration(milliseconds: 500), () {   
            if (mounted)    // 每次更新控制总线前都先检查一下动画对象是否挂载(也就是处在活跃状态)
              {
                setState(() {
                  widget1_isVisible = !widget1_isVisible;
                });
              }
            Timer(Duration(milliseconds: 1000), () {
              // 淡入总线1启动后,启动总线2和控件3动画总线
              if (mounted)
                {
                  setState(() {
                    widget2_isVisible = !widget2_isVisible;
                  });
                }
              if (mounted)
                {
                  _animationController_widget3.forward();
                }
            });
          });
        }
      // 初始化动画总线3
      _animationController_widget3 = AnimationController(
        duration: Duration(seconds: 1), // 设置动画持续时间
        vsync: this,
      );
    }

  // 覆写父类析构函数
  @override
  void dispose ()
    {
      super.dispose();
      // 停止并释放动画总线3
      _animationController_widget3.stop();
      _animationController_widget3.dispose();
    }

  @override
  Widget build(BuildContext context) {
    // 修改窗口标题名称
    WindowManager.instance.setTitle("个人获奖信息查询  --   密码修改页面");
    return Scaffold(
      body: Stack(
        children: [
          // 设置左上角的返回按钮
          Positioned(  
            top: 25,
            left: 25,
            child: SizedBox(
              width: 50,
              height: 50,
              child: YaruBackButton(   // 设置Yaru主题的返回按钮
                onPressed: () {
                  Navigator.of(context).pop();   // 返回上个页面
                  WindowManager.instance.setTitle("个人获奖信息查询  --   登录页面");    // 并且将窗口名称改回上个(登录)页面的
                },
              ),
            ),
          ),
          // 设置全局总列式布局
          Padding(
            padding: const EdgeInsets.only(left:60.0,right:60.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                // 左侧用于显示"忘记密码"等相关提示信息
                Column(
                  mainAxisAlignment: MainAxisAlignment.center,  // 设置文字元素居中显示
                  children: [
                    // 设置两行文字出现动画及文字本体
                    AnimatedOpacity(
                      opacity: widget1_isVisible?1.0:0.0, 
                      duration: Duration(seconds: 1),
                      child: Text(
                        "忘记密码了?",
                        style: TextStyle(
                          fontSize: 56,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                    const SizedBox(height: 40,),
                    AnimatedOpacity(
                      opacity: widget2_isVisible?1.0:0.0, 
                      duration: Duration(seconds: 1),
                      child: Text(
                        "请在右侧修改您的密码",
                        style: TextStyle(
                          fontSize: 35,
                        ),
                      ),
                    ),
                  ],
                ),
                SlideTransition(
                  position: Tween<Offset>(
                    begin: Offset(2.0,0),
                    end: Offset.zero,
                  ).animate(
                    CurvedAnimation(
                      parent: _animationController_widget3, 
                      curve: Curves.easeInOut,
                    ),
                  ),
                  child: Column(   // 设置文本输入框行式布局 
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      SizedBox(
                        width: 400,
                        child: TextField(
                          controller: textcontroller_user_name,
                          decoration: InputDecoration(
                            border: OutlineInputBorder(),   // 设置输入边框
                            labelText: "在这里输入您的姓名",
                          ),
                        ),
                      ),
                      const SizedBox(height: 40,),   // 设置控件间间距
                      SizedBox(
                        width: 400,
                        child: TextField(
                          controller: textcontroller_password,
                          obscureText: true,   // 由于输入的是密码,故不显示文本内容
                          decoration: InputDecoration(
                            border: OutlineInputBorder(),   // 设置输入边框
                            labelText: "在这里输入您需要设置的新密码",
                          ),
                        ),
                      ),
                      const SizedBox(height: 40,),    // 设置控件间间距
                      SizedBox(
                        height: 40,
                        width: 160,
                        child: MyYaruButton_Confirmed(
                          text: "我修改好了", 
                          onPressed: () {
                            change_passwd(textcontroller_user_name.text,textcontroller_password.text);
                          },
                        )
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}
